# for 循环用于针对集合中的每个元素都执行一个代码块，而while
# 循环则不断运行，直到指定的条件不满足为止。

# 可使用while 循环来数数。例如，下面的while 循环从1数到5：
current_number = 1
while current_number <= 5:
	print(current_number)
	current_number += 1

# 你每天使用的程序很可能就包含while 循环。
# 例如，游戏使用while 循环，确保在玩家想玩时不断运行，并在玩家想退出时停止运行。
# 如果程序在用户没有让它停止时停止运行，或者在用户要退出时还继续运行，那就太没有意思了。
# 因此，while 循环很有用

# 可以使用while 循环让程序在用户愿意时不断运行，如下面的程序parrot.py所示。
# 我们在其中定义了一个退出值 ，只要用户输入的不是这个值，程序就将接着运行：
# parrot.py
prompt = "\nTell me something, and I will repeat it back to you: "
prompt += "\nEnter 'quit' to end the program."
message = ""
while message != 'quit':
	message = input(prompt)
	print(message)

# 这个程序很好，唯一美中不足的是，它将单词'quit' 也作为一条消息打印了出来。
# 为修复这种问题，只需使用一个简单的if 测试：
prompt = "\nTell me something, and I will repeat it back to you: "
prompt += "\nEnter 'quit' to end the program."

message = ""
while message != 'quit':
	message = input(prompt)

	if message != 'quit':
		print(message)	

# 使用标志
# 在前一个示例中，我们让程序在满足指定条件时执行特定的任务。
# 但在更复杂的程序中，很多不同的事件会导致程序停止运行。在这种情况下，该怎么办呢？
# 例如，有多种事件可能导致游戏结束，如玩家失去所有飞船、时间已用完，或者要保护的城市被全部摧毁。
# 导致程序结束的事件有很多时，如果在一条while 语句中检查所有这些条件，将既复杂又困难。
# 在要求很多条件都满足才继续运行的程序中，可定义一个变量，用于判断整个程序是否处于活动状态。
# 这个变量称为标志 （flag），充当程序的交通信号灯。可以让程序在标志为True 时继续运行，
# 并在任何事件导致标志的值为False 时让程序停止运行。这样，在while 语句中就只需检查一个条件：标志的当前值是否为True。
# 然后将所有其他测试（是否发生了应将标志设置为False 的事件）都放在其他地方，从而让程序更整洁。

# 在前一节的程序parrot.py中添加一个标志。将其命名为active
# （你可给它指定任何名称），用于判断程序是否应继续运行：
prompt = "\nTell me something, and I will repeat it back to you: "
prompt += "\nEnter 'quit' to end the program."

active = True
while active:
	message = input(prompt)

	if message == 'quit':
		active = False
	else:
		print(message)

# 这个程序的输出与前一个示例相同。前一个示例将条件测试直接放
# 在了while 语句中，而这个程序则使用一个标志来指出程序是否处于活动状态。
# 这样，如果要添加测试（如elif 语句）以检查是否发生了其他导致active 变为False 的事件，就会很容易。
# 在复杂的程序（如很多事件会导致程序停止运行的游戏）中，
# 标志很有用：在任意一个事件导致活动标志变成False 时，主游戏循环将退
# 出，此时可显示一条游戏结束消息，并让用户选择是否要重新玩

# 使用break 退出循环
# 要立即退出while 循环，不再运行循环中余下的代码，也不管条件测试的结果如何，可使用break 语句。
# break 语句用于控制程序流程，可用来控制哪些代码行将执行、哪些代码行不执行，从而让程序按你的要求执行你要执行的代码。
# 例如，来看一个让用户指出他到过哪些地方的程序。在这个程序中，可在用户输入'quit' 后使用break 语句立即退出while 循环：
prompt = "\nPlease enter the name of a city you have visited:"
prompt += "\nEnter 'quit' when you are finished."

while True:
	city = input(prompt)

	if city == 'quit':
		break
	else:
		print(f"I'd love to go to {city.title()}!")
# 以while True打头的循环将不断运行，直到遇到break语句。
# 这个程序中的循环不断让用户输入他到过的城市的名字，直
# 到用户输入'quit' 为止。用户输入'quit' 后，将执行break 语句，导致Python退出循环

# 注意 　在任何Python循环中都可使用break 语句。例如，可使用break 语句来退出遍历列表或字典的for 循环。

# 在循环中使用continue
# 要返回循环开头，并根据条件测试结果决定是否继续执行循环，可使用continue 语句，它不像break 语句那样不再执行余下的代码并退出整个循环。
# 例如，来看一个从1数到10但只打印其中奇数的循环：
# counting.py
current_number = 0
while current_number < 10:
	current_number += 1
	if current_number % 2 == 0:
		continue
	print(current_number)

# 避免无限循环
# 每个while 循环都必须有停止运行的途径，这样才不会没完没了地执行下去。
# 例如，下面的循环从1数到5：
x = 1
while x <= 5:
	print(x)
	x += 1
# 但如果不小心遗漏了代码行x += 1 ，这个循环将没完没了地运行
# 每个程序员都会偶尔因不小心而编写出无限循环，在循环的退出条
# 件比较微妙时尤其如此。如果程序陷入无限循环，可按Ctrl + C，
# 也可关闭显示程序输出的终端窗口。

# 要避免编写无限循环，务必对每个while 循环进行测试，确保其按
# 预期那样结束。如果你希望程序在用户输入特定值时结束，可运行
# 程序并输入这样的值。如果在这种情况下程序没有结束，请检查程
# 序处理这个值的方式，确认程序至少有一个这样的地方能让循环条
# 件为False ，或者让break 语句得以执行。

# 注意 　Sublime Text等一些编辑器内嵌了输出窗口，这可能导
# 致难以结束无限循环，不得不通过关闭编辑器来结束。在这种
# 情况下，可在输出窗口中单击鼠标，再按Ctrl + C，这样应该
# 能够结束无限循环。
